﻿(function ($, undefined) {
	$.util.namespace("$.easyui");
	
	var defaults = {loading: "正在处理，请稍待..."};
	
    
	//  显示类似于 easyui-datagrid 在加载远程数据时显示的 mask 状态层；该函数定义如下重载方式：
    //      function ()
    //      function (options)，其中 options 为一个格式为 { msg, locale } 的 JSON-Object；
    //  上述参数中：
    //      msg 表示加载显示的消息文本内容，默认为 "正在加载，请稍等..."；
    //      locale 表示加载的区域，可以是一个 jQuery 对象选择器字符串，也可以是一个 jQuery 对象或者 HTML-DOM 对象；默认为字符串 "body"。
    //  返回值：返回表示弹出的数据加载框和层的 jQuery 对象。
	$.easyui.loading = function (options) {
        var opts = $.extend({ msg: defaults.loading, locale: "body" }, options || {}),
            jq = $,
            locale = jq(opts.locale),
            array = locale.children().map(function () {
                var zindex = $(this).css("z-index");
                return $.isNumeric(zindex) ? parseInt(zindex) : 0;
            }),
            zindex = $.array.max(array.length ? array : [1]);
        if (!locale.is("body")) {
            locale.addClass("mask-container");
        }
        var mask = jq("<div></div>").addClass("datagrid-mask").css({ display: "block", "z-index": zindex += 100 }).appendTo(locale);
        var msg = jq("<div></div>").addClass("datagrid-mask-msg").css({ display: "block", left: "50%", "z-index": ++zindex }).html(opts.msg).appendTo(locale);
        msg.css("marginLeft", -msg.outerWidth() / 2);
        return mask.add(msg);
    };
    
    //  关闭由 $.easyui.loading 方法显示的 "正在加载..." 状态层；该函数定义如下重载方式：
    //      function ()
    //      function (locale)
    $.easyui.loaded = function (locale) {
        var opts = { locale: "body"};
        if (arguments.length == 1) {
            if ($.isPlainObject(arguments[0])) {
                $.extend(opts, arguments[0]);
            } else {
                opts.locale = arguments[0];
            }
        }
        if (arguments.length == 2) {
            if ($.util.isBoolean(arguments[0])) {
                $.extend(opts, { locale: arguments[1]});
            } else {
                $.extend(opts, { locale: arguments[0]});
            }
        }
        var jq = $, locale = jq(opts.locale);
        locale.removeClass("mask-container");
        locale.children("div.datagrid-mask-msg,div.datagrid-mask").remove();
    };
    
    $.easyui.ajaxError = function (callback) {
        if (!arguments.length) { return $.fn.form.defaults.onLoadError; }
        $.fn.form.defaults.onLoadError = callback;
        $.fn.panel.defaults.onLoadError = callback;
        $.fn.window.defaults.onLoadError = callback;
        $.fn.combobox.defaults.onLoadError = callback;
        $.fn.combotree.defaults.onLoadError = callback;
        $.fn.combogrid.defaults.onLoadError = callback;
        $.fn.datagrid.defaults.onLoadError = callback;
        $.fn.propertygrid.defaults.onLoadError = callback;
        $.fn.tree.defaults.onLoadError = callback;
        $.fn.treegrid.defaults.onLoadError = callback;
        $.ajaxSetup({ error: callback });
    };
    
    var onLoadError = function(XMLHttpRequest, textStatus, errorThrown) {
    	$.easyui.loaded();
    	
    	var title = "", message = "" ;
		var status = XMLHttpRequest.status, title = '未知错误--'+status+'--'+errorThrown, data = XMLHttpRequest.responseText, isJson = true ;
		try {
			if(null == data || '' == data) {
				title = '错误提示';
				message = '无数据响应，请联系管理员';
			} else {
				data = jQuery.parseJSON(data) ;
			}
		} catch(e) {
			isJson = false ;
			console.error(e);
			title = '未知错误--'+textStatus;
			message = '发生错误，请联系管理员';
			//$.messager.alert('提示信息', '发生错误', 'error') ;
		}
		
		if(status == 400) {
			title = status+"--请求无效";
			message = '<ul><li>错误信息：请求无效</li></ul>';
		} else if(status == 403) {
			if(data.type == "noLogin") {
				$.messager.alert({
					title: '提示',
					msg: '<div style="text-align:center;margin-top:10px;"><b>未登录或登录超时</b></div>',
					fn: function(){
						window.location.replace("/login.html")
					}
				});
				return ;
			} else {
				title = status+"--禁止访问";
				message = '<ul><li>权限不足，禁止访问</li></ul>';
			}
		} else if(status == 404) {
			title = status+"--找不到页面";
			message = '<ul><li>错误信息：找不到页面</li></ul>';
		} else if(status == 405) {
			title = status+"--Http请求方式错误";
			message = '<ul><li>错误信息：Http请求方式错误[GET/POST/DELETE/PUSH]</li></ul>';
		} else if(status == 500) {
			title = status+"--服务器内部错误";
			message = '<ul><li>错误信息：'+(isJson?data.message:data)+'</li></ul>';
		} else if(status == 503) {
			title = status+"--服务不可用";
			message = '<ul><li>错误信息：'+(isJson?data.message:data)+'</li></ul>';
		} else if(status == 504) {
			title = status+"--网关超时";
			message = '<ul><li>错误信息：'+(isJson?data.message:data)+'</li></ul>';
		}
    	
		$.messager.alert(title, message) ;
	};


	// 备份 jquery ajax 方法的默认参数。
	$.easyui.ajaxDefaults = $.extend({}, $.ajaxSettings);
    
	//更改 jQuery EasyUI 部分组件的通用错误提示。
	$.easyui.ajaxError(onLoadError);

	//更改 jQuery.ajax 函数的部分默认属性。
	$.ajaxSetup({
		dataFilter : function(data, type) {
			return String(type).toLowerCase(type) == "json" ? $.string.toJSONString(data) : data;
		}
	});
	$.ajaxSettings.crossDomain = true;
	$.ajaxSettings.xhrFields = {
		// 允许携带证书，跨域Cookie
		withCredentials : true
	}

})(jQuery);